/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bombercloud.server;

import bombercloud.commons.BlocoFixo;
import bombercloud.commons.BlocoQuebra;
import bombercloud.commons.Bomba;
import bombercloud.commons.Boneco;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.JOptionPane;

/**
 *
 * @author Leonardo Oliveira Moreira
 */
public class BomberCloudServer extends Thread {

    private ServerSocket serverSocket;
    private ArrayList<BlocoFixo> listParedes;
    private ArrayList<BlocoQuebra> listLugaresPossiveis;
    private ArrayList<BlocoQuebra> listLinhaDeFogo;
    private ArrayList<BlocoQuebra> listLugaresNLivres;
    private ArrayList<Bomba> listBombas;
    private ArrayList<Boneco> listBonecos;
    private ArrayList<BomberCloudServerThread> listTheradSevidor;

    public BomberCloudServer() {



        try {
            serverSocket = new ServerSocket(6666);
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
            serverSocket = null;
        }

        listTheradSevidor = new ArrayList<BomberCloudServerThread>();
        listBonecos = new ArrayList<Boneco>();
        listBombas = new ArrayList<Bomba>();


        listParedes = new ArrayList<BlocoFixo>();
        //parte de cima do tabuleiro
        for (int i = 0; i < 15; i++) {
            int aux = i * 49;
            BlocoFixo bf = new BlocoFixo();
            bf.setX(aux);
            bf.setY(100);
            bf.setImagem(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "Bloco_Fixo.png");
            listParedes.add(bf);
        }
        //parte de baixo do tabuleiro
        for (int i = 0; i < 15; i++) {
            int aux = i * 49;
            BlocoFixo bf = new BlocoFixo();
            bf.setX(aux);
            bf.setY(580);
            bf.setImagem(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "Bloco_Fixo.png");
            listParedes.add(bf);
        }
        //lateral esquerda do tabuleiro
        for (int i = 0; i < 13; i++) {
            int aux = i * 40 + 100;
            BlocoFixo bf = new BlocoFixo();
            bf.setX(0);
            bf.setY(aux);
            bf.setImagem(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "Bloco_Fixo.png");
            listParedes.add(bf);
        }
        //lateral direita do tabuleiro
        for (int i = 0; i < 13; i++) {
            int aux = i * 40 + 100;
            BlocoFixo bf = new BlocoFixo();
            bf.setX(686);
            bf.setY(aux);
            bf.setImagem(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "Bloco_Fixo.png");
            listParedes.add(bf);
        }

        //cricação dos blocos fixos do interior da fase
        for (int j = 1; j < 11; j++) {
            int aux2 = j * 40 + 100;
            if (j % 2 == 0) {
                for (int i = 1; i < 14; i++) {
                    if (i % 2 == 0) {
                        int aux = i * 49;
                        BlocoFixo bf = new BlocoFixo();
                        bf.setX(aux);
                        bf.setY(aux2);
                        bf.setImagem(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "Bloco_Fixo.png");
                        listParedes.add(bf);
                    }
                }
            }
        }

        //CRIAÇÃO DA LINHA DE FOGO
        listLinhaDeFogo = new ArrayList<BlocoQuebra>();
        for (int j = 1; j < 12; j++) {
            int aux2 = j * 40 + 100;
            if (!(j % 2 == 0)) {
                for (int i = 1; i < 14; i++) {
                    int aux = i * 49;
                    BlocoQuebra bq = new BlocoQuebra();
                    bq.setX(aux);
                    bq.setY(aux2);
                    listLinhaDeFogo.add(bq);
                }
            } else {
                for (int i = 1; i < 14; i++) {
                    if (!(i % 2 == 0)) {
                        int aux = i * 49;
                        BlocoQuebra bq = new BlocoQuebra();
                        bq.setX(aux);
                        bq.setY(aux2);
                        listLinhaDeFogo.add(bq);
                    }
                }
            }
        }

        //CRIAÇÃO DOS BLOCOS QUE QUEBRAM
        listLugaresPossiveis = new ArrayList<BlocoQuebra>();
        listLugaresNLivres = new ArrayList<BlocoQuebra>();

        for (int j = 1; j < 12; j++) {
            int aux2 = j * 40 + 100;
            if (!(j % 2 == 0)) {
                for (int i = 1; i < 14; i++) {
                    //if que retira as posições de escape inicial da lista
                    boolean condicao = (i != 1 || j != 1) && ((i != 2) || j != 1)
                            && ((i != 12) || j != 1) && ((i != 13) || j != 1)
                            && ((i != 6) || j != 5) && ((i != 7) || j != 5)
                            && ((i != 1) || j != 11) && ((i != 2) || j != 11)
                            && ((i != 12) || j != 11) && ((i != 13) || j != 11);
                    if (condicao) {
                        int aux = i * 49;
                        BlocoQuebra bq = new BlocoQuebra();
                        bq.setX(aux);
                        bq.setY(aux2);
                        listLugaresPossiveis.add(bq);
                    }
                }
            } else {
                for (int i = 1; i < 14; i++) {
                    //if que retira as posições de escape inicial da lista
                    boolean condicao = (i != 1 || j != 2) && ((i != 13) || j != 2)
                            && ((i != 7) || j != 6) && ((i != 1) || j != 10)
                            && ((i != 13) || j != 10);
                    if (condicao) {
                        if (!(i % 2 == 0)) {
                            int aux = i * 49;
                            BlocoQuebra bq = new BlocoQuebra();
                            bq.setX(aux);
                            bq.setY(aux2);
                            listLugaresPossiveis.add(bq);
                        }
                    }
                }
            }
        }

        int cont = 0;
        //68 é a quantidade de blocos que são colocados na tela
        while (cont < 68) {
            int var = (int) (Math.random() * 98);
            BlocoQuebra bq = new BlocoQuebra();
            bq = listLugaresPossiveis.get(var);
            if (!bq.isEscolhido()) {
                bq.setEscolhido(true);
                bq.setImagem(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "Bloco_quebra.png");
                listLugaresNLivres.add(bq);
                cont++;
            }
        }


    }

    public static void main(String[] args) {
        BomberCloudServer bcs = new BomberCloudServer();
        bcs.start();
    }

    @Override
    public void run() {
        
        try {
                    Class.forName("org.postgresql.Driver");
                    Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bomberCloud", "postgres", "postgres");
                    Statement stmt = connection.createStatement();

                    for (BlocoFixo bf : listParedes) {
                        stmt.execute("INSERT INTO parede (x, y) VALUES (" + bf.getX() + ", " + bf.getY() + ");");
                    }
                    for (BlocoQuebra bq : listLugaresNLivres) {
                        stmt.execute("INSERT INTO bloco (x, y) VALUES (" + bq.getX() + ", " + bq.getY() + ");");
                    }
                    for (BlocoQuebra bq : listLugaresPossiveis) {
                        stmt.execute("INSERT INTO caminho_livre (x, y) VALUES (" + bq.getX() + ", " + bq.getY() + ");");
                    }
                    
                    stmt.close();
                    connection.close();
                } catch (SQLException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                } catch (ClassNotFoundException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }
        
        while (serverSocket != null && !serverSocket.isClosed()) {
            try {
                
                
                
                Socket socket = serverSocket.accept();

                

                BomberCloudServerThread thread = new BomberCloudServerThread(
                        socket,
                        listLugaresPossiveis,
                        listParedes,
                        listLugaresNLivres,
                        listBombas,
                        listBonecos,
                        listTheradSevidor,
                        listLinhaDeFogo);
                addThreadSever(thread);
                thread.start();
            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }




        }
    }

    public void addThreadSever(BomberCloudServerThread obs) {
        listTheradSevidor.add(obs);
    }

    public void removeThreadSever(BomberCloudServerThread obs) {
        listTheradSevidor.remove(obs);
    }

// <editor-fold defaultstate="collapsed" desc="// GETS E SETS ------------------------">
    public ServerSocket getServerSocket() {
        return serverSocket;
    }

    public void setServerSocket(ServerSocket serverSocket) {
        this.serverSocket = serverSocket;
    }

    public ArrayList<BlocoQuebra> getListLugaresPossiveis() {
        return listLugaresPossiveis;
    }

    public void setListLugaresPossiveis(ArrayList<BlocoQuebra> listLugaresPossiveis) {
        this.listLugaresPossiveis = listLugaresPossiveis;
    }

    public ArrayList<BlocoQuebra> getListLugaresNLivres() {
        return listLugaresNLivres;
    }

    public void setListLugaresNLivres(ArrayList<BlocoQuebra> listLugaresNLivres) {
        this.listLugaresNLivres = listLugaresNLivres;
    }

    public ArrayList<Bomba> getListBombas() {
        return listBombas;
    }

    public void setListBombas(ArrayList<Bomba> listBombas) {
        this.listBombas = listBombas;
    }

    public ArrayList<Boneco> getListBonecos() {
        return listBonecos;
    }

    public void setListBonecos(ArrayList<Boneco> listBonecos) {
        this.listBonecos = listBonecos;
    }
    // </editor-fold>
}